package negocio;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import util.GeneradorTurnos;
import hibernate.Facade;

public class Sistema {

	private static Sistema instancia;
	private static Facade facade;
	private GeneradorTurnos generador;
	
	private Sistema(){
		facade = Facade.obtenerInstancia();
		generador = new GeneradorTurnos();
	}
	
	public static Sistema obtenerInstancia(){
		if(instancia == null)
			instancia = new Sistema();
		return instancia;
	}
	
	public void generarTurnos(Medico medico, int meses){
		generador.generarTurnos(medico, meses);
	}
	
	public void guardarAgenda(Agenda agenda){
		facade.guardarAgenda(agenda);
	} 
	
	public Agenda obtenerAgenda(Medico medico){
		return facade.obtenerAgenda(medico);
	}
	
	public void eliminarAgenda(Agenda ag){
		facade.eliminarAgenda(ag);
	}
	
	public void guardarTurnos(List<Turno> turnos){
		facade.guardarTurnos(turnos);
	}
	
	public void actualizarTurnos(List<Turno> turnos){
		facade.actualizarTurnos(turnos);
	}
	
	public void guardarTurno(Turno t){
		facade.guardarTurno(t);
	}
	
	public void actualizarTurno(Turno t){
		facade.actualizarTurno(t);
	}
	
	public List<Turno> obtenerTurnosEnFecha(Medico medico, Calendar fecha){
		return facade.obtenerTurnosEnFecha(medico, fecha);
	}
	
	public Turno obtenerTurnoEnFechaYhora(Medico medico, Calendar fecha){
		return facade.obtenerTurnoEnFechaYhora(medico, fecha);
	}
	
	public List<Medico> obtenerMedicos(){
		return facade.obtenerMedicos();
	}
	
	public void guardarPaciente(Paciente p){
		facade.guardarPaciente(p);
	}
	
	public List<Paciente> buscarPacientes(String caracteres){
		List<Paciente> pacientes = new ArrayList<>();
		for(Paciente p: facade.obtenerPacientes()){
			if(p.getNombre().contains(caracteres) || p.getApellido().contains(caracteres)){
				pacientes.add(p);
			}
		}
		return pacientes;
	}
	
	public List<Especialidad> obtenerEspecialidades (){
		return facade.obtenerEspecialidades();
	}
	
	public List<Especialidad> buscarEspecialidades(String caracteres){
		List<Especialidad> especialidades = new ArrayList<>();
		for(Especialidad e: facade.obtenerEspecialidades()){
			if(e.getNombre().contains(caracteres)){
				especialidades.add(e);
			}
		}
		return especialidades;
	}
	
	public void eliminarObraSocial(ObraSocial os){
		facade.eliminarObraSocial(os);
	}
	
	public void modificarObraSocial(ObraSocial os){
		facade.modificarObraSocial(os);
	}

	public void guardarObraSocial(ObraSocial os) {
		facade.guardarObraSocial(os);	
	}
	
	public List<ObraSocial> obtenerObraSociales(){
		return facade.obtenerObrasSociales();
	}
	
	public List<Paciente> obtenerPacientes(){
		return facade.obtenerPacientes();
	}
	
	
	public List<ObraSocial> buscarObrasSociales(String caracteres){
		List<ObraSocial> obrasSociales = facade.obtenerObrasSociales();
		List<ObraSocial> nueva = new ArrayList<>();
		
		for(ObraSocial os:obrasSociales){
			if(os.getNombre().contains(caracteres)){
				nueva.add(os);
			}
		}
		return nueva;
	}
	
	public void modificarPaciente(Paciente paciente) {
		facade.modificarPaciente(paciente);
		
	}

	public void eliminarPaciente(Paciente paciente) {
		facade.eliminarPaciente(paciente);
		
	}

	public void eliminarEspecialidad(Especialidad especialidad) {
		facade.eliminarEspcialidad(especialidad);
		
	}

	public void guardarOModificarEspecialidades(List<Especialidad> especialidades){
		facade.guardarOModificarEspecialidades(especialidades);
	}

	public void guardarEspecialidad(Especialidad especialidad) {
		facade.guardarEspecialidad(especialidad);
		
	}
	
	public void modificarEspecialidad(Especialidad especialidad) {
		facade.modificarEspecialidad(especialidad);
	}
	
	public void guardarMedico(Medico medico) {
			facade.guardarMedico(medico);
			
	}

	public void eliminarMedico(Medico medico) {
			facade.eliminarMedico(medico);
			
	}

	public void modificarMedico(Medico medico) {
		facade.modificarMedico(medico);
	}


	public void modificarAgenda(Agenda agenda) {
		facade.modificarAgenda(agenda);
		
	}
	
	public List<Medico> buscarMedicos(String caracteres){
		List<Medico> medicos = new ArrayList<>();
		for(Medico m: facade.obtenerMedicos()){
			if(m.getNombre().contains(caracteres) || m.getApellido().contains(caracteres)){
				medicos.add(m);
			}
		}
		return medicos;
	}
}
